/*
 * espetaculo.h
 *
 *  Created on: 19 de Out de 2011
 *      Author: pedrocouto
 */

#ifndef ESPETACULOS_H_
#define ESPETACULOS_H_

#include <string>
#include <vector>

#include "artista.h"
#include "calendario.h"
#include "gestor.h"

using std::string;
using std::vector;

class Artista;
class Gestor;
class Tipo_Espetaculo;
class Data;

class Espetaculo {
protected:
	string codigo;
	string nome; //nome do espetaculo
	string local; //local onde se ira realizar o espetaculo
	Tipo_Espetaculo  * tipo; //tipo do espetaculo, como musical, teatro, etc
	Gestor * gestor; //gestor responsavel pelo espetaculo
	Data *data; //data em que se ira' realizar o espetaculo
public:
	vector <Artista *> artistas; //artistas que entram no espetaculo
	Espetaculo();
	Espetaculo(string _codigo, string _nome, string _local, Tipo_Espetaculo * _tipo, Gestor * _gestor, Data * _data); //argumentos neste construtor
	virtual ~Espetaculo() {}

	//GET
	string getCodigo() { return codigo; }
	string getNome() { return nome; }
	string getLocal() { return local; }
	Tipo_Espetaculo * getTipo()  { return tipo; }
	Gestor * getGestor() { return gestor; }
	Data * getData() { return data; }

	//SET
	void setCodigo(string _codigo) { codigo = _codigo; }
	void setNome(string _nome) { nome = _nome; }
	void setLocal(string _local) { local = _local; }
	void setGestor(Gestor * _gestor) { gestor = _gestor; }
	void setData (Data * _data) { data = _data; }

	int getNumArtistas() const { return artistas.size(); }
	virtual Artista * getArtista(int i) { return artistas[i];}
	void mostraArtistas();
	void removerArtista( int valor) { artistas.erase(artistas.begin()+valor); }
	void adicionaArtista(Artista * a) { artistas.push_back(a); }

	friend class Artista;
};


class Grupo_Espetaculos{
public:
	vector<Espetaculo *> espetaculos;
	int getNumEspetaculos() { return espetaculos.size(); }
	void adicionaEspetaculo(Espetaculo * e) { espetaculos.push_back(e); }
	void removeEspetaculo(int pos) {espetaculos.erase(espetaculos.begin() + pos); }
};

#endif /* ESPETACULOS_H_ */
